package com.itheima.leetcode.od.b.sort;

import java.util.ArrayList;
import java.util.stream.Collectors;

/**
 * (A卷,100分)- 箱子之字形摆放（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 有一批箱子（形式为字符串，设为str），
 * <p>
 * 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地，请输出箱子的摆放位置。
 * <p>
 * 例如：箱子ABCDEFG，空地宽度为3，摆放结果如图：
 * <p>
 * <p>
 * <p>
 * 则输出结果为：
 * <p>
 * AFG
 * <p>
 * BE
 * <p>
 * CD
 * <p>
 * 输入描述
 * <p>
 * 输入一行字符串，通过空格分隔，前面部分为字母或数字组成的字符串str，表示箱子；
 * <p>
 * 后面部分为数字n，表示空地的宽度。例如：
 * <p>
 * ABCDEFG 3
 * <p>
 * 输出描述
 * <p>
 * 箱子摆放结果，如题目示例所示
 * <p>
 * AFG
 * <p>
 * BE
 * <p>
 * CD
 * <p>
 * 备注
 * 请不要在最后一行输出额外的空行
 * <p>
 * str只包含字母和数字，1 <= len(str) <= 1000
 * <p>
 * 1 <= n <= 1000
 * <p>
 * 用例
 * <p>
 * 输入	ABCDEFG 3
 * <p>
 * 输出	AFG
 * <p>
 * BE
 * <p>
 * CD
 * <p>
 * 说明
 * <p>
 * 题目解析
 * <p>
 * 我的解题思路如下：
 * <p>
 * 首先定义一个不定宽的二维矩阵，JS的话很简单，Java的话需要定义为List<List>结构，这个二维矩阵的高度就是给定的空地的n大小，即用例对应的初始二维矩阵应该如下
 * <p>
 * {
 * <p>
 * {},
 * <p>
 * {},
 * <p>
 * {}
 * <p>
 * }
 * <p>
 * 然后，遍历字符串的每一个字符，比如用例中ABCDEFG，首先A被插入二维矩阵的第0行，即字符A在字符串中的索引 i % n 的值，比如A字符索引为i=0，n=3, 因此插入行为 i % n = 0
 * <p>
 * {
 * <p>
 * {A},
 * <p>
 * {},
 * <p>
 * {}
 * <p>
 * }
 * <p>
 * 遍历B，插入二维矩阵第1行，即 i=1 , n =3, i % n = 1
 * <p>
 * {
 * <p>
 * {A},
 * <p>
 * {B},
 * <p>
 * {}
 * <p>
 * }
 * <p>
 * 遍历C，插入二维矩阵的第2行，即 i=2, n=3, i%n=2
 * <p>
 * {
 * <p>
 * {A},
 * <p>
 * {B},
 * <p>
 * {C}
 * <p>
 * }
 * <p>
 * 下面到关键点了，遍历D，应该插入二维矩阵的第几行呢？按照前面公式 i=3，n=3，插入行应该是第 i % n = 0 行。
 * <p>
 * 但是实际上，应该要是第2行，如下面所示
 * <p>
 * {
 * <p>
 * {A},
 * <p>
 * {B},
 * <p>
 * {C，D}
 * <p>
 * }
 * <p>
 * 因此，此时插入行的公式应该变为  插入行 = n - 1 - (i%n) = 3-1-0 = 2
 * <p>
 * 后面E、F的插入都遵循该公式
 * <p>
 * {
 * <p>
 * {A，F},
 * <p>
 * {B，E},
 * <p>
 * {C，D}
 * <p>
 * }
 * <p>
 * 但是遍历到G时，G的索引i = 6，n=3, i % n = 0，那么此时G应该插入哪一行呢？按照前面的公式，应该插入n - 1 - (i%n) = 3-1-0 = 2，但是实际上应该插入第0行，如下所示
 * <p>
 * {
 * <p>
 * {A，F，G},
 * <p>
 * {B，E},
 * <p>
 * {C，D}
 * <p>
 * }
 * <p>
 * 此时，我们可以总结出，遍历的字符插入到二维矩阵的行数和其索引有关，索引和行数的转换方程有两个：
 * <p>
 * 行数 = n - 1 - (i%n)
 * <p>
 * 行数 = i % n
 * <p>
 * 初始时，用公式：行数 = i % n，
 * <p>
 * 当遇到 i % n ==0时，变换公式为：行数 = n - 1 - (i%n)，
 * <p>
 * 当遇到 i%n==0时，再变换公式为：行数 = i % n，
 * <p>
 * 当遇到 i % n ==0时，变换公式为：行数 = n - 1 - (i%n)，
 * <p>
 * 当遇到 i%n==0时，再变换公式为：行数 = i % n，
 * <p>
 * .......
 * <p>
 * 因此我们可以用一个reverse来标记，
 * <p>
 * 当reverse=true，用公式：行数 = i % n
 * <p>
 * 当reverse=false，用公式：行数 = n - 1 - (i%n)
 * <p>
 * 而reverse变化的条件就是i % n ==0，每遇到i % n ==0，reverse = !reverse
 */
public class BoxShapedPlacement {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);

        String str = sc.next();
        int n = sc.nextInt();*/

        String[] intputArr = "ABCDEFG 3".split(" ");

        System.out.println(getResult(intputArr[0], Integer.parseInt(intputArr[1])));
    }

    public static String getResult(String str, int n) {
        ArrayList<ArrayList<Character>> matrix = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            matrix.add(new ArrayList<>());
        }

        boolean reverse = true;
        for (int i = 0; i < str.length(); i++) {
            int k = i % n;
            if (k == 0) {
                reverse = !reverse;
            }
            if (reverse) {
                k = n - 1 - k;
            }
            matrix.get(k).add(str.charAt(i));
        }

        return matrix.stream()
                .map(list -> list.stream()
                        .map(String::valueOf)
                        .collect(Collectors.joining("")))
                .collect(Collectors.joining("\n"));
    }
}